package com.evl.utils;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.collections.CollectionUtils;

import com.evl.common.persistence.model.FrequentContactT;

public class ObjectTurnUtils {

	 public static Object mapToObject(Map<String, Object> map, Class<?> beanClass) throws Exception {      
	        if (map == null)    
	            return null;      
	     
	        Object obj = beanClass.newInstance();    
	     
	        Field[] fields = obj.getClass().getDeclaredFields();     
	        for (Field field : fields) {      
	            int mod = field.getModifiers();      
	            if(Modifier.isStatic(mod) || Modifier.isFinal(mod)){      
	                continue;      
	            }      
	     
	            field.setAccessible(true);      
	            field.set(obj, map.get(field.getName()));     
	        }     
	     
	        return obj;      
	    }      
	     
	    public static Map<String, Object> objectToMap(Object obj) throws Exception {      
	        if(obj == null){      
	            return null;      
	        }     
	     
	        Map<String, Object> map = new HashMap<String, Object>();      
	     
	        Field[] declaredFields = obj.getClass().getDeclaredFields();      
	        for (Field field : declaredFields) {      
	            field.setAccessible(true);    
	            map.put(field.getName(), field.get(obj));    
	        }      
	     
	        return map;    
	    } 
	    
	    public static Map<String, Object> objectToMap(Object obj , List<Map<String, Object>> params) throws Exception {      
	    	if(obj == null){      
	    		return null;      
	    	}     
	    	
	    	Map<String, Object> map = new HashMap<String, Object>();      
	    	
	    	Field[] declaredFields = obj.getClass().getDeclaredFields();      
	    	for (Field field : declaredFields) {      
	    		field.setAccessible(true);    
	    		map.put(field.getName(), field.get(obj));    
	    		if(CollectionUtils.isNotEmpty(params)){
	    			for(Map<String, Object> param : params){
	    				if(param.containsKey(field.getName()))
	    					map.put(field.getName(), param.get(field.getName()));    
	    			}
	    		}
	    	}      
	    	
	    	return map;    
	    } 
	    
	    @SuppressWarnings({ "rawtypes", "unchecked" })
		public static <T> List<T> objectSetParam(List<T> list , List<Map<String, Object>> params) throws Exception {
	    	List<T> result = new ArrayList<T>();
	    	for(Object o : list){
	    		Class clazz = o.getClass();
	    		Map<String, Object> map = objectToMap(o , params);
	    		result.add((T) mapToObject(map, clazz));
	    	}
	    	return result;
	    }
	    
	    public static void main(String[] args) {
	    	List<FrequentContactT> concats = new ArrayList<FrequentContactT>();
	    	FrequentContactT contact = new FrequentContactT();
	    	contact.setId(1);
	    	concats.add(contact);
	    	
	    	List<Map<String, Object>> params = new ArrayList<Map<String,Object>>();
	    	Map<String, Object> param = new HashMap<String, Object>();
	    	param.put("name", "哈哈");
	    	params.add(param);
	    	try {
	    		List<FrequentContactT> result = objectSetParam(concats, params);
	    		System.out.println(result);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
}
